home *** CD-ROM | disk | FTP | other *** search
- /*
- * Yamana's Otomeza Plug-in Tool
- * Xwindow Bit Map セーバ
- *
- * 1995.08.07
- * 1995.08.12 異常な遅さを誇っていたので一気に5倍程度高速化した
- *
- */
-
- #include "otome_pi.h"
-
- const char longname[] = "FILE : XBM saver";
- const char extend[] = "XBM";
-
- #define USE_FILE PI_SAVE
- #include "otome_pi.c"
-
-
- char *readbuf,*buf;
- char *bufp;
-
- /*************************************************************************/
-
- #define COLUMN 12
- #define TMPSIZE (Width*7) /* これくらいで大丈夫のはずなんだが… */
-
- #define to16a(c) (( (c)<0x0a ) ? (c)+'0': (c)-0x0a+'a' )
-
- int XBM_write( wbuf, Width, fp )
- char *wbuf;
- int Width;
- FILE *fp;
- {
- static unsigned int column=0;
- int i,p;
- char *tmp = wbuf+Width;
-
- for( i=0,p=0; i<Width ; i++,column++ )
- {
- if( column>0 )
- tmp[ p++ ] = ',';
- if( (column % COLUMN)==0 )
- strcpy( tmp+p, "\r\n " ),p+=3;
-
- strcpy( tmp+p, " 0x" ),p+=3;
- tmp[ p++ ] = to16a( wbuf[i] >>4 );
- tmp[ p++ ] = to16a( wbuf[i] & 0xf);
- }
- if( fwrite( tmp, 1, p, fp ) == p )
- return NOERR;
- else
- return ERROR;
-
- }
-
- /***********************/
-
- int vramWidth;
-
- int getcol16(image,x,y)
- char *image;
- int x,y;
- {
- return (image[ (x>>1) + y*vramWidth ] >> ((x & 1)? 4:0))& 0x0f ;
- }
-
- int getcol256(image,x,y)
- char *image;
- int x,y;
- {
- return (image[ x + y*vramWidth ] );
- }
-
- int XBM_writeData( image, col, pix, size, name, fp )
- char *image,*name;
- int col,pix;
- POINT *size;
- FILE *fp;
- {
- int Bit[] = { 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 };
- int x,y;
- int Width,realWidth;
- int (*getcol)();
- char *wbuf;
-
- fputs( "static char " ,fp );
- fputs( name ,fp );
- fputs( "_bits[] = {" ,fp );
-
-
- /* 乙女座からは32ドット単位で渡される */
- vramWidth = (size->x+31)& 0xffe0 ;
- realWidth = (size->x+ 7)& 0xfff8 ; /* しかし記録は 8ビット単位 */
-
- if( pix==4 )
- { vramWidth >>= 1;
- getcol = getcol16;
- }else
- getcol = getcol256;
-
- Width = realWidth>>3;
-
- if( (wbuf=PI_MALLOC( Width+ TMPSIZE ))==NULL ) return PI_ERROR_NO_MEMORY;
-
- for( y=0; y<size->y ; y++ )
- {
- for( x=0; x< Width; x++ )
- wbuf[x] = 0;
-
- for( x=0; x<realWidth ; x++ )
- { if( getcol(image,x,y) == col )
- wbuf[ x>>3 ] |= Bit[x & 7];
- }
-
- if( XBM_write( wbuf, Width, fp ) )
- return ERROR;
-
- }
-
- fputs( "};\r\n", fp );
- PI_FREE( wbuf );
-
- return NOERR;
- }
-
-
- /***********************/
-
- void del_ext( name, str )
- char *name,*str;
- {
- for( ; *str!='\0' && *str!='.' ; name++,str++ )
- *name = ((*str>='A' && *str<='Z') ? (*str+' ') : *str );
- *name = '\0';
- }
-
- int XBM_writeSize( size, name,fp )
- POINT *size;
- char *name;
- FILE *fp;
- {
- char tmp[8];
-
- /* ディスクが一杯とかいろいろ...最初だけチェックすれば大丈夫 */
- if( fputs( "#define ",fp ) ) return ERROR;
- fputs( name ,fp );
- fputs( "_width " ,fp );
- itoa( size->x, tmp, 10 );fputs( tmp, fp );
- fputs( "\r\n" ,fp );
-
- fputs( "#define " ,fp );
- fputs( name ,fp );
- fputs( "_height " ,fp );
- itoa( size->y, tmp, 10 );fputs( tmp, fp );
- fputs( "\r\n" ,fp );
-
- return NOERR;
- }
-
- /***********************/
-
-
- int APL_exec()
- {
- FILE *fp;
- char name[16];
- int ret;
-
- if( pi_imge->pix >8 ) return ERROR;
-
- if( (fp = fopen( PI_FNAME, "wb" )) == NULL )
- return PI_ERROR_FILE_OPEN;
-
- del_ext( name, PI_FNAME );
- XBM_writeSize( &pi_imge->size, name, fp );
-
- // printf("color = %d",PI_FORECOL ); /* V1.3b じゃ得られないんだね */
-
- ret = XBM_writeData( pi_imge->image, PI_FORECOL, pi_imge->pix,
- &pi_imge->size, name, fp );
-
- fclose( fp );
- if( ret ) remove( PI_FNAME );
-
- return ret;
- }
-
-